//package com.ctrip.corp.obt.shard.utils;
//
//
//import com.ctrip.corp.obt.generic.utils.StringPool;
//import com.ctrip.corp.obt.shard.annotation.SqlParserIgnore;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.reflection.MetaObject;
//
//import java.lang.reflect.Method;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * SQL 解析辅助类
// *
// * @author marco.zheng
// * @since 2018-07-22
// */
//public class SqlParserHelper {
//
//    private static final String DELEGATE_MAPPED_STATEMENT = "delegate.mappedStatement";
//    /**
//     * SQL 解析缓存
//     * key 可能是 mappedStatement 的 ID,也可能是 class 的 name
//     */
//    private static final Map<String, Boolean> SQL_PARSER_INFO_CACHE = new ConcurrentHashMap<>();
//
//    /**
//     * 初始化缓存 接口上 SqlParser 注解信息
//     *
//     * @param mapperClass Mapper Class
//     */
//    public static synchronized void initSqlParserInfoCache(Class<?> mapperClass) {
//        SqlParserIgnore sqlParserIgnore = mapperClass.getAnnotation(SqlParserIgnore.class);
//        if (sqlParserIgnore != null) {
//            SQL_PARSER_INFO_CACHE.put(mapperClass.getName(), sqlParserIgnore.filter());
//        }
//    }
//
//    /**
//     * 初始化缓存 方法上 SqlParser 注解信息
//     *
//     * @param mapperClassName Mapper Class Name
//     * @param method          Method
//     */
//    public static void initSqlParserInfoCache(String mapperClassName, Method method) {
//        SqlParserIgnore sqlParserIgnore = method.getAnnotation(SqlParserIgnore.class);
//        if (sqlParserIgnore != null) {
//            if (SQL_PARSER_INFO_CACHE.containsKey(mapperClassName)) {
//                // mapper 接口上有注解
//                Boolean value = SQL_PARSER_INFO_CACHE.get(mapperClassName);
//                if (!value.equals(sqlParserIgnore.filter())) {
//                    // 取反,不属于重复注解,放入缓存
//                    String sid = mapperClassName + StringPool.DOT + method.getName();
//                    SQL_PARSER_INFO_CACHE.putIfAbsent(sid, sqlParserIgnore.filter());
//                }
//            } else {
//                String sid = mapperClassName + StringPool.DOT + method.getName();
//                SQL_PARSER_INFO_CACHE.putIfAbsent(sid, sqlParserIgnore.filter());
//            }
//        }
//    }
//
//    /**
//     * 获取 SqlParser 注解信息
//     *
//     * @param metaObject 元数据对象
//     */
//    public static boolean getSqlParserInfo(MetaObject metaObject) {
//        String id = getMappedStatement(metaObject).getId();
//        Boolean value = SQL_PARSER_INFO_CACHE.get(id);
//        if (value != null) {
//            return value;
//        }
//        String mapperName = id.substring(0, id.lastIndexOf(StringPool.DOT));
//        return SQL_PARSER_INFO_CACHE.getOrDefault(mapperName, false);
//    }
//
//    /**
//     * 获取当前执行 MappedStatement
//     *
//     * @param metaObject 元对象
//     */
//    private static MappedStatement getMappedStatement(MetaObject metaObject) {
//        return (MappedStatement) metaObject.getValue(DELEGATE_MAPPED_STATEMENT);
//    }
//
//    private SqlParserHelper() {}
//}
